const { checkLoginUserRecord, postLogin } = require('./login');
const { postRegister } = require('./register');
const { findUser } = require('./account');
const { ERROR } = require('../../common/error');

async function realPreUnifiedLogin(params = {}) {
    const { user, type } = params;
    const appId = this.getUniversalClientInfo().appId;
    const { total, userMatched } = await findUser({
        userQuery: user,
        authorizedApp: appId,
    });
    if (userMatched.length === 0) {
        if (type === 'login') {
            if (total > 0) {
                throw {
                    errCode: ERROR.ACCOUNT_NOT_EXISTS_IN_CURRENT_APP,
                };
            }
            throw {
                errCode: ERROR.ACCOUNT_NOT_EXISTS,
            };
        }
        return {
            type: 'register',
            user,
        };
    }
    if (userMatched.length === 1) {
        if (type === 'register') {
            throw {
                errCode: ERROR.ACCOUNT_EXISTS,
            };
        }
        const userRecord = userMatched[0];
        checkLoginUserRecord(userRecord);
        return {
            type: 'login',
            user: userRecord,
        };
    } else if (userMatched.length > 1) {
        throw {
            errCode: ERROR.ACCOUNT_CONFLICT,
        };
    }
}

async function preUnifiedLogin(params = {}) {
    try {
        const result = await realPreUnifiedLogin.call(this, params);
        return result;
    } catch (error) {
        await this.middleware.uniIdLog({
            success: false,
        });
        throw error;
    }
}

async function postUnifiedLogin(params = {}) {
    const { user, extraData = {}, isThirdParty = false, type, inviteCode } = params;
    let result;
    if (type === 'login') {
        result = await postLogin.call(this, {
            user,
            extraData,
            isThirdParty,
        });
    } else if (type === 'register') {
        result = await postRegister.call(this, {
            user,
            extraData,
            isThirdParty,
            inviteCode,
        });
    }
    return {
        ...result,
        type,
    };
}

module.exports = {
    preUnifiedLogin,
    postUnifiedLogin,
};
